<?php
abstract class Nippy_Controller_PageLoader_Abstract extends Zend_Controller_Action {
	public $mapperTree;
    /*
     * Node Identity
     */
	protected $_id;
	protected $_page;
	public function getPage(){return $this->_page;}
    /*
     * Instance of class Zend_Cache
     * for cahing database objects
     */
    protected $_cache;
	public function getCache(){return $this->_cache;}
    protected $_Cache_id;
    
	public function init(){
    	$this->mapperTree = new Admin_Model_TreeNodeMapper();
        $bootstrap = $this->getInvokeArg('bootstrap');
		if (null==$bootstrap)
            throw new Zend_Exception('Не возможно загрузить bootstrap');
    	$this->_cache = $bootstrap->getResource('cachemanager')->getCache('database');
        if (null==$this->_cache) throw new Zend_Exception('Не сконфигурирован cachemanager с кешем "database"');
    }
    
	public function indexAction(){
    	$r = $this->getRequest();
        $this->_id = (int)$r->getParam('Id',0);
        
        list($node,$layout) = $this->_id==0 ? $this->mapperTree->findIndexPage() : $this->mapperTree->find($this->_id,true);
		
		//if ($node==NULL) throw new .... 404
        
		$this->_helper->layout->setLayout($layout);
        
        if ($node!=null){
	        $menu = $this->mapperTree->fetchFullMenu($this->_id);
	        $nav = new Zend_Navigation($menu);
			$this->view->navigation($nav);
        }
        $this->_page=$node;
	    $this->view->page = $node;
	}
	
	/**
	 * Из строки запроса вытаскивается параметр id и прочие параметры
	 * По идентификатору id загружает узел.
	 * Представление загруженного узла ищется в кеше.
	 * Если представление узла не найдено в кеше, оно генерируется "на лету".
	 * Представление и узел сохраняются в переменных представления для данного контроллера: HTML и page 
	 */
	protected function _loadPage(){
    	$r = $this->getRequest();
    	$this->_id = (int)$r->getParam('Id',0);
        $this->_id = $this->_id>0?$this->_id:'index';
		
		if (('index'==$this->_id) && ($_SERVER['REQUEST_URI']!='') && ($_SERVER['REQUEST_URI']!='/') && ($_SERVER['REQUEST_URI']{1}!='?'))
			throw new Zend_Controller_Action_Exception('Страница с адресом '.$_SERVER['REQUEST_URI'].' не существует.',404);

    	$this->_Cache_id = $this->_id;
        $node_cache_id = 'node_'.$this->_id;
    	$params = null;
    	if (($p=strpos($r->getRequestUri(),'?'))!==false){
    		$query = substr($r->getRequestUri(),$p+1);
    		$this->_Cache_id .= '_'.md5($query);
    		parse_str($query,$params);
    	}
		
		$node = null;
		$layout = null;
        
        //list($this->_id,$layout) = $this->mapperTree->findLayout($this->_id);
        if (!$this->_cache->test($node_cache_id)) {
            $a = $this->_id=='index' ? $this->mapperTree->findIndexPage() : $this->mapperTree->find($this->_id,true);
            list($node,$layout) = $a;
            $this->_id = $node->getId();
            //var_dump($node);
            $node->setCache(true);
            $this->_cache->save(serialize($a));
        }
        else
            list($node,$layout) = unserialize($this->_cache->load($node_cache_id));
    	
    	$this->_helper->layout->setLayout($layout);
		if (!$this->_cache->test('render_'.$this->_Cache_id)){
            //$node = $this->mapperTree->find($this->_id,false);
        	$str = $node->render($r,$params);
        	$this->_cache->save($str);
		}
		else
			$str=$this->_cache->load('render_'.$this->_Cache_id);
		$this->view->HTML = $str;
	    $this->view->page = $node;
	    $this->_page=$node;
	}
}

?>